package com.spsa.negocio;

import java.io.IOException;

import javax.ejb.Asynchronous;
import javax.ejb.EJB;
import javax.ejb.Stateless;
import javax.ejb.TransactionAttribute;
import javax.ejb.TransactionAttributeType;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

import com.ibm.mq.MQException;
import com.spsa.Parametros;
import com.spsa.mensajeria.util.ConexionMQ;
import com.spsa.negocio.servicios.ServicioEstadosTiendas;
import com.spsa.persistencia.entidades.EstadoInterfaz;

@Stateless
@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
public class ProcesadorMensajesBean{
	static final Logger logger = LogManager.getLogger(ProcesadorMensajesBean.class.getName());

	@EJB 
	private ConexionMQ conexionMQ;
	@EJB
	private ServicioEstadosTiendas servicioTiendas;
	
	@Asynchronous
	public void procesarMensajes() {
		int tiempoEsperaReconeccion = Integer.parseInt(Parametros.get("ProcesadorMensajesBean.TIEMPO_RECONEXION")); 
		
		while (true) {
			try {
				EstadoInterfaz estadoInterfaz = conexionMQ.siguienteMensaje();
				intentarProcesarMensaje(estadoInterfaz);
			}
			catch(MQException e) {
				esperarParaIntentarConectar(tiempoEsperaReconeccion);
				conexionMQ.intentarConectar();
			} catch (IOException e) {
				logger.error("No se pudo deserializar el mensaje", e);
			} catch (ClassNotFoundException e) {
				logger.error("El mensaje recibido esta corrupto", e);
			}
		}
	}

	private void intentarProcesarMensaje(EstadoInterfaz estadoInterfaz) {
		try {
			procesarMensaje(estadoInterfaz);
			conexionMQ.commit();
			logger.info("Se proceso el mensaje. " + estadoInterfaz);
		}catch(Exception e) {
			logger.fatal("No se pudo procesar un mensaje: " + estadoInterfaz, e); //$NON-NLS-1$
			conexionMQ.rollBack();
		}
	}

	private void esperarParaIntentarConectar(int tiempoEsperaReconeccion) {
		try {
			Thread.sleep(tiempoEsperaReconeccion);
		}
		catch(Exception e) {
			logger.error("Error al suspender hilo", e); //$NON-NLS-1$
		}
	}

	private void procesarMensaje(EstadoInterfaz estadoInterfaz) throws Exception{
		servicioTiendas.actualizarEstadoDeInterfaz(estadoInterfaz);
	}
}
